package main

import "fmt"

// ToArray 稀疏数组变换为数组
func ToArray(sparseArray [][]int) (result [][]int) {

	iCount := sparseArray[0][0] // 行数
	jCount := sparseArray[0][1] // 列数
	fmt.Printf("row %d ,columns %d !\n", iCount, jCount)
	// init
	result = make([][]int, iCount)
	for i := 0; i < iCount; i++ {
		result[i] = make([]int, jCount)
		for j := 0; j < jCount; j++ {
			result[i][j] = 0
		}
	} // end init
	for i := 1; i < len(sparseArray); i++ {
		row := sparseArray[i][0]
		column := sparseArray[i][1]
		value := sparseArray[i][2]
		result[row][column] = value
	}
	return
}

// ToSparseArray 数组变化为稀疏数组
func ToSparseArray(arr [][]int) [][]int {
	result := make([][]int, 0)
	result = append(result, make([]int, 3))
	result[0][0] = len(arr)
	result[0][1] = len(arr[0])
	// result[0][1] = total count
	totalCount := 0
	// 获取总共的数量
	for i := 0; i < len(arr); i++ {
		for j := 0; j < len(arr[i]); j++ {
			if arr[i][j] != 0 {
				totalCount++ // 总计数增加1个
				// 在稀疏数组中记录一行
				t := make([]int, 3)
				t[0] = i
				t[1] = j
				t[2] = arr[i][j]
				result = append(result, t)
			}
		}
	}
	result[0][2] = totalCount // 第一行赋值完毕
	return result
}

// PrintArray print array
func PrintArray(arr [][]int) {
	for i := 0; i < len(arr); i++ {
		for j := 0; j < len(arr[i]); j++ {
			fmt.Printf("%3d", arr[i][j])
		}
		fmt.Printf("\n")
	}
}
func main() {
	// 初始化一个数组 LENGTH * LENGTH
	const LENGTH = 10
	arr := make([][]int, LENGTH)
	for i := 0; i < len(arr); i++ {
		arr[i] = make([]int, LENGTH)
	}
	arr[1][2], arr[2][3], arr[2][4], arr[9][9] = 1, 5, 9, 10
	// end 初始化一个数组 LENGTH * LENGTH
	PrintArray(arr)

	PrintArray(ToSparseArray(arr))

	PrintArray(ToArray(ToSparseArray(arr)))
}
